<template>
	<view class="container">
		<view class="list">
			<view class="item" v-for="(item, index) in list" :key="index">
				<view v-if="item.code === 1">
					<view class="status">状态：推送成功</view>
					<view class="content">
						<view>订单名称：{{ item.data.name }}</view>
						<view>订单号：{{ item.data.code }}</view>
						<view>订单原价：{{ item.data.total }} 元</view>
						<view>支付金额：{{ item.data.price }} 元</view>
						<view>支付方式：{{ item.data.type ? item.data.type : '未知' }}</view>
						<view>支付时间：{{ item.data.paytime }}</view>
					</view>
				</view>
				<view v-else-if="item.code === 0">
					<view class="status">状态：推送失败</view>
					<view class="content">
						<view>错误信息：{{ item.data.msg }}</view>
						<view>支付金额：{{ item.data.price }} 元</view>
						<view>支付方式：{{ item.data.type ? item.data.type : '未知' }}</view>
						<view>支付时间: {{ item.data.paytime }}</view>
					</view>
				</view>

				<view v-else-if="item.code === 2">
					<view class="status">状态：回调成功</view>
					<view class="content">
						<view>操作信息：{{ item.data.msg }}</view>
						<view>支付金额：{{ item.data.price }} 元</view>
						<view>支付方式：{{ item.data.type ? item.data.type : '未知' }}</view>
						<view>支付时间: {{ item.data.paytime }}</view>
					</view>
				</view>

				<view v-else-if="item.code === 3">
					<view class="status">状态：获取通知失败</view>
					<view class="content">
						<view>错误信息：{{ item.data.msg }}</view>
						<view>软件：{{ item.data.type ? item.data.type : '未知' }}</view>
						<view>时间: {{ item.data.paytime }}</view>
					</view>
				</view>

				<view v-else-if="item.code === 4">
					<view class="status">状态：回调失败</view>
					<view class="content">
						<view>错误信息：{{ item.data.msg }}</view>
						<view>支付金额：{{ item.data.price }} 元</view>
						<view>支付方式：{{ item.data.type ? item.data.type : '未知' }}</view>
						<view>支付时间: {{ item.data.paytime }}</view>
					</view>
				</view>
			</view>
		</view>
		<button class="btn" @click="onListRemove">清除记录</button>
	</view>
</template>

<script>
// 引入监听插件
const NoticeBarModule = uni.requireNativePlugin('lu-NoticeBarModule');
export default {
	data() {
		return {
			LoginAuth:{},
			gateway:'',
			list:[]
		}
	},
	onShow() {
		let LoginAuth = this.$Tools.authCheck(true);

		if(LoginAuth === false) return;

		// 把this存起来
        let that = this;

        uni.getNetworkType({
			success: function (res) {
				if(res.networkType === 'none')
				{
					that.$Tools.ToastError('请先连接网络或者打开移动网络');
				}
			}
		});

		// 获取通知使用权限状态
		let NoticeStatus = NoticeBarModule.readNotificationBar();

		if(NoticeStatus === false)
		{
			this.$Tools.ToastError({
				title:'请开启通知使用权限',
				success:() => {
					setTimeout(() => {
						uni.switchTab({
							url:'/pages/setting/index'
						});
					},1500);
				}
			})

			return;
		}

		this.LoginAuth = LoginAuth;

		let gateway = uni.getStorageSync('gateway') ? uni.getStorageSync('gateway') : '';

		this.gateway = gateway;

		// 获取列表名称
		let listName = this.LoginAuth.username + 'List';

		// 获取本地缓存的记录
		let list = uni.getStorageSync(listName) ? uni.getStorageSync(listName) : [];

		this.list = list;

		// 调用初始化插件的方法
		this.NoticeBarInit();

		// 开始监听
		this.getNotification();
	},
	methods: {
		// 初始化插件
		NoticeBarInit()
		{
			NoticeBarModule.init();
		},
		// 开启监听
		getNotification()
		{

			// NoticeBarModule.permanentNotice({
			// 	//状态栏标题
			// 	ticker: "状态栏标题",    //必填
			// 	//通知ID
			// 	notifyId: 1,    //int类型
			// 	//通知标题
			// 	title: "收款监听客户端",  //必填
			// 	//通知的内容
			// 	content: "正在运行中"    //必填
			// });

			// 监听通知
			NoticeBarModule.getNotification(async res => {
				// 获取通知的标题
				let title = res.title ?? '';

				// 接收收款通知的时间
				let payTime = res.notify_time ?? '';

				// 获取通知的内容
				let content = res.content ?? '';

				// 获取当前通知的App包名
				let pkg = res.pkg ?? '';

				// 获取到支付的金额
				let price = 0;

				// 获取列表名称
				let listName = this.LoginAuth.username + 'List';

				// 判断当前通知是否是微信或者支付宝
				if(pkg === 'com.eg.android.AlipayGphone' || pkg === 'com.tencent.mm')
				{
					// 支付方式
					let type = '未知';

					// 判断包名 由于支付宝跟微信的收款通知不同，所以下面分别对微信跟支付宝做处理
					switch(pkg)
					{
						// 支付宝
						case 'com.eg.android.AlipayGphone':
							// 通过正则获取到支付金额
							let titleReg = new RegExp('你已成功收款(.*)元.*');

							// 匹配正则
							let titleRes = title.match(titleReg);
							let titleArr = titleRes ? Object.values(titleRes) : [];

							// 获取正确的支付金额
							price = titleArr[1] ?? 0;

							type = '支付宝支付';
							break;

						// 微信
						case 'com.tencent.mm':
							// 通过正则获取到支付金额
							let oldContentReg = new RegExp('微信支付收款(.*)元.*');
							let newContentReg = new RegExp('.*微信支付: 个人收款码到账¥(.*)')

							// 匹配正则
							let oldContentRes = content.match(oldContentReg);
							let newContentRes = content.match(newContentReg);

							let oldContentArr = oldContentRes ? Object.values(oldContentRes) : [];
							let newContentArr = newContentRes ? Object.values(newContentRes) : [];
							
							let oldPrice = oldContentArr[1] ?? 0;
							let newPrice = newContentArr[1] ?? 0;

							// 获取正确的支付金额
							price = oldPrice || newPrice;
							type = '微信支付';
							break;
					}

					// 防止数据类型不是浮点数
					price = parseFloat(price);

					// 如果监听到金额为0，输出内容
					if(!price || price === 0)
					{
						// 追加数据
						this.list.unshift({
							code:3,
							data:{
								msg:'获取不到收款金额',
								type:type,
								paytime:payTime
							}
						});

						// 设置本地缓存
						uni.setStorageSync(listName,this.list);

						return;
					}

					// 通过支付金额请求查询订单的接口
					let checkUrl = this.gateway + '/pay/index/check';

					// 封装参数
					let data = {
						price,
						payTime,
						adminid:this.LoginAuth.id
					}
					
					// 发起请求
					let result = await this.$Http.post({
						url:checkUrl,
						params:data
					});

					// 如果操作失败的话，把返回的结果追加到列表里
					if(result.code === 0)
					{
						// 追加数据
						this.list.unshift({
							code:0,
							data:{
								msg:result.msg,
								price:price,
								type:type,
								paytime:payTime
							}
						});

						// 设置本地缓存
						uni.setStorageSync(listName,this.list);

						return;
					}

					// 操作成功也把结果追加到列表里
					this.list.unshift({
						code:1,
						data:{
							name:result.data.name,
							code:result.data.code,
							total:result.data.total,
							price:result.data.price,
							type:type,
							paytime:payTime
						},
					});

					// 更新本地缓存
					uni.setStorageSync(listName,this.list);

					// 发起请求处理收款通知后的业务
					let callbackResult = await this.$Http.post({
						url:result.data.notice,
						params:result.data
					});

					if(callbackResult.code === 1)
					{
						// 追加数据
						this.list.unshift({
							code:2,
							data:{
								msg:callbackResult.msg,
								price:price,
								type:type,
								paytime:payTime
							}
						});

						// 设置本地缓存
						uni.setStorageSync(listName,this.list);

						return;
					}else{
						// 追加数据
						this.list.unshift({
							code:4,
							data:{
								msg:callbackResult.msg,
								price:price,
								type:type,
								paytime:payTime
							}
						});

						// 设置本地缓存
						uni.setStorageSync(listName,this.list);

						return;
					}
				}
				
			});
			
		},
		onListRemove()
		{
			this.list = [];
			// 获取列表名称
			let listName = this.LoginAuth.username + 'List';
			uni.removeStorageSync(listName);
		}
	}
}
</script>

<style>

page{
	background: #f1f1f1;
	padding-bottom: 6vh;
}

.btn{
	position: fixed;
	bottom: 0;
	width: 100%;
	background: rgb(209, 52, 52);
	color: #fff;
}

.list .item {
	padding: 10px;
	background: #fff;
	margin-bottom: 10px;
}

.list > .item:first-child{
	margin-top: 0;
}


</style>
